'''
Created on 07-02-2014

@author: G
'''
import sys
import psycopg2
import urllib2,zipfile
import time
import glob
from datetime import datetime,timedelta
from datetime import date


class conexionBaseDeDatos():
    
    #def conexionBaseDeDatos(self):
        
     #   con = None
     #   try:
     #       con = psycopg2.connect(database='tesis3',user='postgres', password='jugador')
     #   except psycopg2.DatabaseError, e:
     #       print 'Error %s' %e
     #       sys.exit(1)
     #   
        
    
    
    def leercomprimido(self):
        
        con = None
        try:
            con = psycopg2.connect(database='carisma',user='postgres', password='jugador')
            cur = con.cursor()

        except psycopg2.DatabaseError, e:
            print 'Error %s' %e
            sys.exit(1)
        
        
        listaZip = glob.glob("C:/Users/gabrielantonio/tesis archivos/*.zip")
        print listaZip;
        
            
        for inicio in listaZip:
        
            print "archivo : "+inicio
            time.sleep(1)
            a = zipfile.ZipFile(inicio,'r')
            #print 'lista de ficheros incluidos en el zip ',a.namelist(), '\n'
        
            for contador in a.namelist():
                #print 'anio '+contador[0:4]+' mes '+contador[4:6]+' dia '+contador[6:8] # + ' magnetometro '+contador[8:12]+'\n'

                Archivo =  a.read(contador, pwd=None)
                listado = Archivo.split('\n')
                
                
                arregloDeDatos=""
                 
                
                fecha= str(listado[1])[0:4]+"-"+str(listado[1])[4:6]+"-"+str(listado[1])[6:8]+" "+str(listado[1])[8:10]+":"+str(listado[1])[10:12]+":"+str(listado[1])[12:14]
                print "\n Magnetometro cabecera "+str(listado[0])[0:4]+" "+fecha
                print "esta en la BD?: "+str(datetime.now())
                            
                sql = "SELECT magnetometro_nombre FROM dato WHERE magnetometro_nombre = '"+str(listado[0])[0:4]+"'and fecha='"+fecha+"';"
                print sql
                cur.execute(sql)
                resultado = cur.fetchone()
                print "time respuesta: "+str(datetime.now())
                timestamp = datetime.strptime(fecha,'%Y-%m-%d %H:%M:%S')
                #st = datetime.datetime.fromtimestamp(datetime.year(listado[1][0:4]),datetime.month(listado[1][4:6]),datetime.day(listado[1][6:8])[datetime.hour(listado[1][8:10])[datetime.minute(listado[1][10:12])[datetime.second(listado[1][12:14])]]]).strftime('%Y-%m-%d %H:%M:%S')
                                   
                                       
                if resultado == None:
                
                    print "leyendo datos : "+str(datetime.now())       
                    cuenta=0
            
                    for indice in listado:  
                
                        ##capturar detalles del magnetometro, nombre, latitud, longitud
                        if cuenta==0:
                                        
                            titulo = indice.split()
                            sql = "SELECT idmagnetometro FROM magnetometro WHERE nombre ='"+titulo[0]+"';"
                            cur.execute(sql)
                            result = cur.fetchone()
                        
                            if result ==None:
                                sql = "INSERT INTO magnetometro(nombre,latitud,longitud) VALUES('"+titulo[0]+"',"+titulo[1]+","+titulo[2]+");"
                                cur.execute(sql)
                                con.commit()       
                        
                        
                        #capturar datos para ingresarlos a la BD   
                        if cuenta==1:
                        
                        
                            fechaParseada =indice[0:4]+"-"+indice[4:6]+"-"+indice[6:8]+" "+indice[8:10]+":"+indice[10:12]+":"+indice[12:14]
                            
                            if str(indice[45:46])=="x":
                                arregloDeDatos="('"+titulo[0]+"','"+fechaParseada+"',"+str(indice[15:24]).strip()+","+str(indice[25:34]).strip()+","+str(indice[35:45]).strip()+",'X'"+")"
                            else:
                                arregloDeDatos="('"+titulo[0]+"','"+fechaParseada+"',"+str(indice[15:24]).strip()+","+str(indice[25:34]).strip()+","+str(indice[35:45]).strip()+",null)"                               
                                
                                # si esta la primera tupla de todo el conjunto entonces no es necesario insertar todas las tuplas
                        if cuenta>1:
                            
                            if (str(indice).__len__()>1):
                                fechaParseada =indice[0:4]+"-"+indice[4:6]+"-"+indice[6:8]+" "+indice[8:10]+":"+indice[10:12]+":"+indice[12:14]
                            
                                if str(indice[45:46])=="x":
                                    arregloDeDatos+=",('"+titulo[0]+"','"+fechaParseada+"',"+str(indice[15:24]).strip()+","+str(indice[25:34]).strip()+","+str(indice[35:45]).strip()+",'X'"+")"
                                else:
                                    arregloDeDatos+=",('"+titulo[0]+"','"+fechaParseada+"',"+str(indice[15:24]).strip()+","+str(indice[25:34]).strip()+","+str(indice[35:45]).strip()+",null)"                               
                            
                                
                                
                        cuenta=cuenta+1
            
                    cuenta=0    
            
                    if arregloDeDatos.__len__()>0: #si tiene mas de la primera tupla para ingresar los datos
                        print "ingresar a BD : "+str(datetime.now())
                        try:    
                        
                            sql = "INSERT INTO dato(magnetometro_nombre,fecha,x,y,z,detalle) VALUES"+arregloDeDatos
                            cur.execute(sql)
                            con.commit()
                            print "> Ingreso bien: "+str(datetime.now())
                               
                        except:
                            
                            con.commit()
                            cur.close()
                            con.close()    
                            con = psycopg2.connect(database='tesis3',user='postgres', password='jugador')
                            cur = con.cursor()

                            print "Error ingreso"
                            datos = str(arregloDeDatos).replace("),(",")(")                            
                            datos = str(datos).split(")(")
                            
                            for indice in datos:
                                
                                indice = str(indice).replace("(","")
                                indice = str(indice).replace(")","")
                                                
                                try:
                                    
                                    sqlIndividual = "INSERT INTO dato(magnetometro_nombre,fecha,x,y,z,detalle) VALUES("+indice+");"
                                    cur.execute(sqlIndividual)
                                    print "    BIEN HECHO------------   "+sqlIndividual
                                    
                                except:
                                    con.commit()
                                    cur.close()
                                    con.close()
                            
                                    con = psycopg2.connect(database='tesis3',user='postgres', password='jugador')
                                    cur = con.cursor()
                                    sqlindividual = "INSERT INTO dato(magnetometro_nombre,fecha,x,y,z,detalle) VALUES('"+str(listado[0])[0:4]+"','"+str(timestamp)+"',null,null,null,null);"
                                    cur.execute(sqlindividual)
                                    print "   Error---------------  "+sqlIndividual
                                    con.commit()
                                    
                            
                                timestamp = timestamp + timedelta(seconds=1)
                            
                        
                    arregloDeDatos=""
                    con.commit()
        print "\nProc almacenado: \n"+str(datetime.now())
        self.triggerActualizacionDatos
        
    
   
    def triggerActualizacionDatos(self):


        print "\nProc almacenado: \n"+str(datetime.now())
        
        con = None
        try:
            con = psycopg2.connect(database='tesis2',user='postgres', password='jugador')
            cur = con.cursor()

        except psycopg2.DatabaseError, e:
            print 'Error %s' %e
            sys.exit(1)

                        
            sql = "DELETE FROM ANIO;"
            cur.execute(sql)
            con.commit()

            sql = "INSERT INTO ANIO SELECT DISTINCT(EXTRACT(YEAR FROM fecha)),magnetometro_nombre from dato ORDER BY magnetometro_nombre;"
            cur.execute(sql)
            con.commit()

            sql = "DELETE FROM MES;"
            cur.execute(sql)
            con.commit()

            sql = "INSERT INTO MES(ANIO_idANIO,idMES, ANIO_MAGNETOMETRO_NOMBRE) SELECT DISTINCT EXTRACT(YEAR FROM fecha), EXTRACT(MONTH FROM fecha),magnetometro_nombre from dato ORDER BY magnetometro_nombre;"
            cur.execute(sql)
            con.commit()

            sql = "DELETE FROM DIA;"
            cur.execute(sql)
            con.commit()

            sql = "INSERT INTO DIA(MES_ANIO_idANIO,MES_idMES,idDIA,MES_ANIO_MAGNETOMETRO_NOMBRE) SELECT DISTINCT EXTRACT(YEAR FROM fecha), EXTRACT(MONTH FROM fecha),EXTRACT(DAY FROM fecha),magnetometro_nombre from dato;"
            cur.execute(sql)
            con.commit()
        con.close()

 